加法运算
隐式转化
二元运算:x + y = z
知识点
- 加法运算包含有两种运算重载:数字加法和字符串连接
- 从右侧解析到左侧
- 加法运算步骤:
- 1:原始值强制转换:强制转化为基础数据类型
- 2:有一方是字符串都转化为字符串
- 3:否则,双方都会被转换为数字,执行数字加法。
字符串拼接
js
'1'+'a'='1a' // 都为基础数据类型 -> 有字符串直接拼接
'1'+'2'='12'
'1'+ 2 ='12'
4+[1,2,3]= '41,2,3' // 数组转化为基础数据类型 -> 有字符串直接拼接
[]+{}
js
{}.toString() = '[object Object]'
[].toString() = ''
''+ '[object Object]' = '[object Object]'
[]+0
js
[].toString = ''
'' + 0 = '0'
boolean
boolean 基础数据类型,Number(true) = 1
js
// boolean 转化为 Number
{}+true=1
5+true = 6
true+true=2
一元运算:+x = y
toNumber(getValue(expr))
js
+ '1' = 1
+ {} = NaN
{} + [] = 0
一元 And 二元运算
js
'a' + + 'b'= 'a'+'NaN' = 'aNaN' // 因为 + 'b' 等于 NaN,所以结果为 "aNaN",你可能也会在一些代码中看到过 + '1' 的形式来快速获取 number 类型。
{}+[]
js
// {} 代码块忽略 等于直接计算 +[]
[].toString() = ''
+ '' = 0
其他:除了加法的运算(乘除减)
那么对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转为数字
js
4 * "3"; // 12
4 * []; // 0
4 * [1, 2]; // NaN
扩展
[] == ![]
- 规则
- 有一个 boolean, 转化其为 number
- 有一个字符串,转化其为 number
- 有一个对象,toPrimitive(obj) 得到基本数据类型按照上面进行比较
- 两个对象比较同一个地址
js
![] // => !true => false
[] == false;
[] == 0
'' == 0
0 == 0
参考
https://wohugb.gitbooks.io/javascript/content/grammar/conversion.html